// 理解核心两个进程:主进程(根目录下的index.js)和渲染进程(main.html和remain.html)
// 渲染进程 => 主进程
// 主进程 => 渲染进程
// 渲染进程 => 渲染进程 (借助主进程实现)

// 本案例基与掘进:[入门Electron，手把手教你编写完整实用案例] https://juejin.cn/post/6974192432443293726

// 引入两个模块:app 和 BrowserWindow
// app模块，控制整个应用程序的事件生命周期
// BrowserWindow模块，创建和控制浏览器窗口

// electron是基于Node.js的，所以入口文件使用node.js的语法 require等导入
const path = require("path"); //node.js的路径模块
const {
  app,
  BrowserWindow,
  ipcMain,
  Tray,
  Menu,
  screen,
  dialog,
} = require("electron");

const iconPath = path.join(__dirname, "./src/img/icon.png"); //应用运行时的标题栏图标 __dirname返回当前文件的绝对路径，iconPath为当前文件夹绝对路径 + './src/img/icon.png' 确保打包后路径问题没错

let mainWindow, tray, remindWindow;

app.on("ready", () => {
  console.log("===== app ready ==");
  console.log(__dirname, "=== __dirname ===");
  // 创建一个浏览器窗口
  mainWindow = new BrowserWindow({
    // resizable: false, //不允许用户改变窗口大小
    // frame: false, //去掉默认的菜单栏
    width: 800,
    height: 600,
    icon: iconPath, //应用运行时的标题栏图标
    webPreferences: {
      backgroundThrottling: false, //设置应用在后台正常运行
      nodeIntegration: true, //设置能在页面使用nodejs的API
      contextIsolation: false,
      preload: path.join(__dirname, "./preload.js"),
    },
  });
  // 加载index.html文件
  mainWindow.loadURL(`file:${__dirname}/src/main.html`); // loadUrl 可以加载远程url、本地url、本地文件等
  //   mainWindow.removeMenu(); //移除默认菜单栏(frame虽然设置了false，但是如果不通过调用api，仍然可以使用快捷键打开菜单)

  //   ------ 托盘设置 start  mac系统似乎没有托盘相关功能 ------
  tray = new Tray(iconPath); //实例化一个tray对象，构造函数的唯一参数是需要在托盘中显示的图标url
  tray.setToolTip("Tasky"); //鼠标移到托盘中应用程序的图标上时，显示的文本
  tray.on("click", () => {
    //点击图标的响应事件，这里是切换主窗口的显示和隐藏
    if (mainWindow.isVisible()) {
      mainWindow.hide();
    } else {
      mainWindow.show();
    }
  });
  tray.on("right-click", () => {
    //右键点击图标时，出现的菜单，通过Menu.buildFromTemplate定制，这里只包含退出程序的选项。
    const menuConfig = Menu.buildFromTemplate([
      {
        label: "Quit",
        click: () => app.quit(),
      },
    ]);
    tray.popUpContextMenu(menuConfig);
  });
  //   ------ 托盘设置 end ------

  // ----------   ipc通信 start ----------
  // ipc通信 监听渲染进程 main.html页面发送的消息
  ipcMain.on("mainWindow:close", () => {
    mainWindow.hide();
  });

  ipcMain.on("remindWindow:close", () => {
    remindWindow.close();
  });
});
// ----------   ipc通信 end ----------
ipcMain.on("setTaskTimer", (event, time, task) => {
  const now = new Date();
  const date = new Date();
  date.setHours(time.slice(0, 2), time.slice(3), 0);
  const timeout = date.getTime() - now.getTime();
  setTimeout(() => {
    createRemindWindow(task);
  }, timeout);
});

function createRemindWindow(task) {
  if (remindWindow) remindWindow.close();
  remindWindow = new BrowserWindow({
    height: 450,
    width: 360,
    resizable: false,
    frame: false,
    icon: iconPath,
    show: false,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false,
      // preload: path.join(__dirname, './preload.js')
    },
  });
  remindWindow.removeMenu();
  const size = screen.getPrimaryDisplay().workAreaSize;
  const { y } = tray.getBounds();
  const { height, width } = remindWindow.getBounds();
  const yPosition = process.platform === "darwin" ? y : y - height;
  remindWindow.setBounds({
    x: size.width - width,
    y: yPosition + 800,
    height,
    width,
  });
  remindWindow.setAlwaysOnTop(true);
  remindWindow.loadURL(`file://${__dirname}/src/remind.html`);
  remindWindow.show();
  remindWindow.webContents.send("setTask", task); //主进程发信息给渲染进程 发送数据
  remindWindow.on("closed", () => {
    remindWindow = null;
  });
  setTimeout(() => {
    remindWindow && remindWindow.close();
  }, 50 * 1000);
}

function checkUpdate() {
  if (process.platform == "darwin") {
    autoUpdater.setFeedURL("http://127.0.0.1:9005/darwin");
  } else {
    autoUpdater.setFeedURL("http://127.0.0.1:9005/win32");
  }
  autoUpdater.checkForUpdates();
  autoUpdater.on("error", (err) => {
    console.log(err);
  });
  autoUpdater.on("update-available", () => {
    console.log("found new version");
  });
  autoUpdater.on("update-downloaded", () => {
    dialog
      .showMessageBox({
        type: "info",
        title: "应用更新",
        message: "发现新版本，是否更新？",
        buttons: ["是", "否"],
      })
      .then((buttonIndex) => {
        if (buttonIndex.response == 0) {
          autoUpdater.quitAndInstall();
          app.quit();
        }
      });
  });
}

app.on("activate", () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
